

export function Dep() {
  // 存储当前实例收到的所有watcher
  this.watchers = []
}
/**
 *  target是一个静态属性，值为null或者为watcher实例 
 *  在实例化Watcher时进行赋值，以来收集完毕后，在Watcher中又重新赋值为null
 */
Dep.target = null
/**
 * 
 * 依赖收集的方法，收集Watcher
 * 在发生读取操作时（vm.xx）并且 Dep.target部位null时进行收集
 */
Dep.prototype.depend = function () {
  // 防止重复收集
  if (this.watchers.includes(Dep.target)) return
  // 收集
  if (Dep.target) {
    this.watchers.push(Dep.target)
  }
  
}

/**
 * dep通知收集的所有watcher执行更新函数
 */
Dep.prototype.notify = function () {
  for(let watcher of this.watchers) {
    watcher.update()
  }
}

/**
 * 存储所有的 Dep.target
 */
const targetStack = []

/**
 * 备份本次的Watcher， 并赋值给Dep.target
 * @param {*} target 
 */
export function pushTarget(target) {
  targetStack.push(target)
  Dep.target = target
}

/**
 * 将Dep.target 重设为上一个Watcher或者null
 */
export function popTarget() {
  targetStack.pop()
  Dep.target = targetStack.at(-1)
}